package com.cn.springcloudwechat.service.vaccine.weixinImp;

import com.cn.springcloudwechat.common.utils.Util;
import com.cn.springcloudwechat.common.utils.weixin.api.WechatAPI;
import com.cn.springcloudwechat.common.utils.weixin.api.WechatAPIImpl;
import com.cn.springcloudwechat.common.utils.weixin.util.ConfigReader;
import com.cn.springcloudwechat.common.utils.weixin.vo.MPAccount;
import com.cn.springcloudwechat.common.utils.weixin.vo.api.Template;
import com.cn.springcloudwechat.model.weixin.user.Follower;
import com.cn.springcloudwechat.common.utils.weixin.vo.api.Follower2;
import com.cn.springcloudwechat.common.utils.weixin.vo.api.QRTicket;
import com.cn.springcloudwechat.model.weixin.user.WxFollower;
import com.cn.springcloudwechat.service.vaccine.weixinService.WeiXinService;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service("WeiXinService")
public class WeiXinServiceImp implements WeiXinService {
	protected static WechatAPI ua;

	protected static ConfigReader _cr;

	protected MPAccount mpAct;

	protected static String accessToken;

	// 初始化
	public void init() {
		_cr = new ConfigReader("/weixin/mp.properties");
		mpAct = new MPAccount();
		mpAct.setMpId(_cr.get("mpId"));
		mpAct.setAppId(_cr.get("appId"));
		mpAct.setAppSecret(_cr.get("appSecret"));
		mpAct.setAESKey(_cr.get("aseKey"));
		accessToken = _cr.get("accessToken");
		ua = WechatAPIImpl.create(mpAct);
	}
	/**
	 * 获取open_id
	 *@方法名:getOpenId
	 *@描述:
	 *@param code
	 *@return
	 */
	@Override
	public String getOpenId(String code) {
		init();
		return ua.getOpenId(code);
	}
	// 获取用户信息
	@Override
	public Follower getWXUserByOpenId(String openId) {
		init();
		return ua.getFollower(openId, "zh_CN");
	}

	// 上传素材获取meaid 此meaid就是上传永久素材的meaid
	@Override
	public String getMediaId(HttpServletRequest request, String path, String index) {
		init();
		// 服务器路径 协议+ip+端口+项目名
		String url = request.getScheme();
		String ip = request.getLocalAddr();
		String port = String.valueOf(request.getLocalPort());
		url = url + "://" + ip + ":" + port + "/vaccine";
		System.err.println("url=" + url);
		StringBuffer buffer = new StringBuffer();
		buffer.append(url);
		buffer.append(path);
		path = buffer.toString();
		System.out.println("getMeaId path=" + path);
		// 暂定为上传的素材为图片
		String pathType = path.substring(path.lastIndexOf(".") + 1).toUpperCase();
		String type = null;
		if (index.equals("4")) {
			// 64KB
			System.out.println("缩略图");
			type = "thumb";
		} else {
			if (pathType.equals("PNG") || pathType.equals("JPEG") || pathType.equals("JPG") || pathType.equals("GIF")) {
				// 2M，支持bmp/png/jpeg/jpg/gif格式
				type = "image";
			} else if (pathType.equals("AMR") || pathType.equals("MP3")) {
				// 10MB，支持MP4格式
				type = "voice";
			} else if (pathType.equals("MP4")) {
				// 2M，播放长度不超过60s，mp3/wma/wav/amr格式
				type = "video";
			} else {
				System.out.println("the parameter is 'type' error");
			}
		}
		String meaid = null;
		if (type != null) {
			meaid = ua.getMediaId(path, type, index);
		}
		return meaid;
	}
	/**
	 * 客户主动推送用户消息48小时活跃用户有效
	 */
	@Override
	public String sendMessage(String message, String openId) {

		return null;
	}
	/**
	 * 获取票据生成二维码
	 */
	@Override
	public Map<String,Object> geTicket(String sceneId, int expireSeconds) {
		init();
		System.out.println("getTicket parameter expire_seconds=" + expireSeconds + "action_name=" + sceneId);
		QRTicket qrTicket = null;
		Map<String,Object> qr = null;
		boolean flag = Util.isDigit(sceneId);
		if (flag) {
			BigInteger sc = new BigInteger(sceneId);
			qrTicket = ua.createQR(sc, expireSeconds);
		} else {
			qrTicket = ua.createQR(sceneId, expireSeconds);
		}
		System.out.println("qrTicket=" + qrTicket.getTicket());
		try {
			qr = getQR(URLEncoder.encode(qrTicket.getTicket(), "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println(qr);
		return qr;
	}

	/**
	 * 获取二维码
	 */
	@Override
	public Map<String, Object> getQR(String ticket) {
		return ua.getQR(ticket);
	}

	/**
	 * 群发消息
	 */
	@Override
	public String sendMassMessage(String media_id) {

		return null;
	}

	/**
	 * 创建标签
	 */
	@Override
	public String create_tag(String name) {
		init();
		return ua.create_tag(name);
	}

	/**
	 * 查询标签
	 */
	@Override
	public String query_tag() {
		init();
		return ua.quert_tag();
	}

	/**
	 * 修改标签
	 */
	@Override
	public String update_tag(String id, String name) throws UnsupportedEncodingException {
		init();
		return ua.update_tag(id, name);
	}

	/**
	 * 删除标签
	 */
	@Override
	public String Delete_tag(String id) throws UnsupportedEncodingException {
		init();
		return ua.delete_tag(id);
	}

	/**
	 * 获取标签下粉丝列表(某个标签) tag_id 标签 open_id 从某个粉丝开始拉取 (不填默认从头拉取)
	 */
	@Override
	public String query_tag_user_list(String tag_id, String open_id) throws UnsupportedEncodingException {
		init();
		return ua.query_tag_user_list(tag_id, accessToken);
	}

	/**
	 * 批量为用户打标签
	 * 
	 * @方法名:add_tag_user
	 * @描述:
	 * @param tag_id
	 * @param list
	 * @return
	 */
	@Override
	public String add_tag_user(String tag_id, List<String> list) throws UnsupportedEncodingException {
		init();
		return ua.add_tag_user(tag_id, list);
	}

	/**
	 * 为用户批量取消标签
	 * 
	 * @方法名:channel_tag_user
	 * @param tag_id
	 * @param list
	 * @return
	 */
	@Override
	public String channel_tag_user(String tag_id, List<String> list) throws UnsupportedEncodingException {
		init();
		return ua.channel_tag_user(tag_id, list);
	}

	/**
	 * 获取用户所在的标签
	 * 
	 * @方法名:get_tag_user
	 * @描述:
	 * @param open_id
	 * @return
	 */
	@Override
	public String get_tag_user(String open_id) throws UnsupportedEncodingException {
		init();
		return ua.get_tag_user(open_id);
	}

	/**
	 * 获取关注者用户列表(拉取粉丝 一次最多10000) 从next_openid开始拉取
	 */
	@Override
	public String get_user_list(String next_openid) {
		init();
		return ua.get_user_list(next_openid);
	}
	/**
	 * 批量获取用户基本信息[最多拉取100条]
	 * 
	 *            批量用户集合{@link Follower2}
	 * @return 关注用户{@link Follower}
	 */
	@Override
	public List<Follower> getFollowers(String openIds[]) {
		init();
		List<Follower2> list=new ArrayList<Follower2>();
		for(String openId:openIds){
			Follower2 follower=new Follower2();
			follower.setOpenid(openId);
			follower.setLang("zh_CN");
			list.add(follower);
		}
		return ua.getFollowers(list);
	}
	/**
	 * 添加客户账号
	 * @方法名:addCustomer
	 * @描述:
	 * @param kf_account
	 *            完整客服帐号，格式为：帐号前缀@公众号微信号，帐号前缀最多10个字符，必须是英文、数字字符或者下划线，后缀为公众号微信号，
	 *            长度不超过30个字符
	 * @param nickname
	 * @return
	 */
	@Override
	public String addCustomer(String kf_account, String nickname) throws UnsupportedEncodingException {
		init();
		kf_account=kf_account+"@kfdz_wxpt";
		return ua.addCustomer(kf_account, nickname);
	}

	/**
	 * 绑定客户到微信
	 * 
	 * @方法名:bindingCustmoerWeixin
	 * @描述:
	 * @param kf_account
	 *            完整客服帐号，格式为：帐号前缀@公众号微信号，帐号前缀最多10个字符，必须是英文、数字字符或者下划线，后缀为公众号微信号，
	 *            长度不超过30个字符
	 * @param invite_wx
	 *            接收绑定邀请的客服微信号
	 * @return
	 */
	@Override
	public String bindingCustmoerWeixin(String kf_account, String invite_wx) throws UnsupportedEncodingException {
		init();
		kf_account=kf_account+"@kfdz_wxpt";
		return ua.bindingCustmoerWeixin(kf_account, invite_wx);
	}

	/**
	 * 上传客户头像
	 */
	@Override
	public String uploadCustomerHeadurl(String kf_account, String path) {
		init();
		kf_account=kf_account+"@kfdz_wxpt";
		return ua.uploadCustomerHeadurl(kf_account, path);
	}

	/**
	 * 获取客户基本信息
	 * @方法名:getCustomer
	 * @描述:
	 * @return
	 */
	@Override
	public String getCustomer() {
		init();
		return ua.getCustomer();
	}

	/**
	 * 修改客户信息
	 */
	@Override
	public String updateCustomer(String kf_account, String nick_name) throws UnsupportedEncodingException {
		init();
		kf_account=kf_account+"@kfdz_wxpt";
		return ua.updateCustomer(kf_account, nick_name);
	}

	/**
	 * 创建会话
	 */
	@Override
	public String createDialogue(String kf_account, String openid) throws UnsupportedEncodingException {
		init();
		kf_account=kf_account+"@kfdz_wxpt";
		return ua.createDialogue(kf_account, openid);
	}

	/**
	 * 关闭某个客户的会话
	 * @方法名:deleteDialogue
	 * @描述:
	 * @param openid
	 * @return
	 */
	@Override
	public String deleteDialogue(String kf_account, String openid) throws UnsupportedEncodingException {
		init();
		kf_account=kf_account+"@kfdz_wxpt";
		return ua.deleteDialogue(kf_account, openid);
	}
	/**
	 * 获取客户会话状态
	 * @方法名:getDialogueStatus
	 * @描述:
	 * @param openid
	 * @return kf_acount 正在接待的客服，为空表示没有人在接待 createtime 会话接入的时间
	 */
	@Override
	public String getDialogueStatus(String openid) {
		init();
		return ua.getDialogueStatus(openid);
	}
	/**
	 * 获取客服会话列表
	 * 
	 * @方法名:getCustomerList
	 * @描述:
	 * @param kf_account
	 * @return
	 */
	@Override
	public String getCustomerList(String kf_account) {
		init();
		kf_account=kf_account+"@kfdz_wxpt";
		return ua.getCustomerList(kf_account);
	}
	/**
	 * 获取客户未接入会话列表
	 * @方法名:noDialogue
	 * @描述:
	 * @return
	 */
	@Override
	public String noDialogue() {
		init();
		return ua.noDialogue();
	}
	/**
	 * 获取聊天记录
	 * 
	 * @方法名:getChatRecord starttime 起始时间， unix时间戳 endtime
	 *                    结束时间，unix时间戳，每次查询时段不能超过24小时 msgid 消息id顺序从小到大，从1开始
	 *                    number 每次获取条数，最多10000条
	 * @描述:
	 * @return worker 完整客服帐号，格式为：帐号前缀@公众号微信号 openid 用户标识 opercode
	 *         操作码，2002（客服发送信息），2003（客服接收消息） text 聊天记录 time 操作时间，unix时间戳
	 *        若获取的number和请求的number一致 则可能会有聊天记录没获取完,再次拉取msgid和返回设置为一样再次请求此接口
	 */
	@Override
	public String getChatRecord(String starttime, String endtime, String msgid, String number) throws UnsupportedEncodingException {
		init();
		return ua.getChatRecord(starttime, endtime, msgid, number);
	}

	@Override
	public String getNewHead(String openId) {
		init();
		Follower follower = ua.getFollower(openId, "zh_CN");
		return follower.getHeadimgurl();
	}

	/**
	 * 模板编码查看模板id
	 * @param tmcode
	 * @return
	 */
	@Override
	public String getTemplateId(String tmcode) {
		init();
		return ua.getTemplateId(tmcode);
	}

	@Override
	public String getTemplateId() {
		init();
		return ua.getTemplateId();
	}

	/**
	 * 发送模板消息
	 * @param openId
	 *            接收用户Id
	 * @param tmlId
	 *            模板Id
	 * @param topColor
	 *            顶部颜色
	 * @param url
	 *            跳转链接
	 * @param tmls
	 *            模板数据
	 * @return
	 */
	@Override
	public long sendTemplateMsg(String openId, String tmlId, String topColor, String url, Template... tmls) {
		init();
		return ua.sendTemplateMsg(openId, tmlId, topColor, url,tmls);
	}

}
